import com.google.gson.Gson;

public class ObjectDemo {
    public static void main(String[] args) throws CloneNotSupportedException {
//        Object o = new Object();

        //java.lang.Object@4eec7777
        //System.out.println(o.toString());

        /**
         *
         * System类名
         * out变量
         * println（）方法
         * 输出对象的原理就是把对象加包名类名转为toString
         *
         * */

//        Student s = new Student();
//        s.setName("张三");
//        s.setAge(23);
//        想看到对象内部的内容 就重写对象的toString方法
//        System.out.println(s.toString()); //{name = null, age = 0}



//Student s1=new Student();
//s1.setAge(20);
//Student s2=new Student();
//s2.setAge(20);
//System.out.println(s1==s2);//false 比较的是地址值

//        System.out.println(s1.equals(s2));//false


        /**
         * 以下为什么是false
         * 因为调用的是object的equals
         * object.equals的原理就是比较对象的地址值
         *
         * 需要重写equals方法比较对象属性值是否相等
         *
         *     @Override
         *     public boolean equals(Object o) {
         *     // 非空判断 类型判断
         *         if (o == null || getClass() != o.getClass()) return false;
         *         Student student = (Student) o;
         *         return age == student.age && Objects.equals(name, student.name);
         *     }
         *
         *     强转为Student再进行比较
         *     再比较下面的值
         *
         * */

        /**
         * 对象克隆 clone
         * 如果一个implements接口中没有抽象方法 那就表示它是一个标记性接口
         * 如果Cloneable表示了一旦实现 那么当前类就可以被克隆
         * 如果没有实现 当前类就不能被克隆
         *
         * 一般使用第三方工具进行深克隆gson
         * 我使用的版本是2.6.2
         * 先把对象转换为json字符串 再把json字符串转换为对象
         * */

        int[]data={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0};
        User u1=new User(1,"张三","123456","boy111",data);
        //方法在底层会帮我们创建一个对象 并把原对象拷贝过去
        //Object.clone是浅拷贝方法 只能拷贝到对象中的属性值 不能拷贝到复杂数据类型的堆数据
        //只是拷贝地址值而已
//        Object u2=(User) u1.clone();
        //u1.data[1]=999; //所以这里的修改同时影响到了两个对象data中的值
        // 这里能直接输出对象的值而不是地址值的原因是上层类重写了toString
//        System.out.println(u1);
//        System.out.println(u2);

        /**
         * gson使用
         * */
        // 先创建一个Gson对象
        Gson gson = new Gson();
        // 把对象转换为json字符串
        String json = gson.toJson(u1);
//        System.out.println(json);
        // 把json字符串转换为对象
        User u3 = gson.fromJson(json, User.class);
        System.out.println(u3);
    }
}
